package com.rgs.platform.task;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.rgs.platform.bo.CovidBO;
import com.rgs.platform.entity.CrawlingCovidDO;
import com.rgs.platform.service.CrawlingCovidService;
import com.rgs.platform.util.RgsHttpUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @program: com-rgs-parent
 * @description: 定时任务抓取疫情数据，存入MySQL
 * @author: Mr.Ren
 * @create: 2022-11-02 19:57
 **/
@Component
public class Covid19DataCrawlerTask {
    //调试日志
    private final static Logger logger = LoggerFactory.getLogger(Covid19DataCrawlerTask.class);

    @Resource
    private CrawlingCovidService crawlingCovidService;

    /**
     * 定时任务
     * 左到右7个
     * 秒（0-59）
     * 分（0-59）
     * 时（0-23）
     * 日（1-31）
     * 月（1-12或SUN–SAT）
     * 年份（1970–2099）
     * <p>
     * 可用值
     * 秒0-59 , - * /
     * 分0-59 , - * /
     * 小时0-23 , - * /
     * 日1-31 , - * ? / L W C
     * 月1-12 or JAN-DEC , - * /
     * 周几1-7 or SUN-SAT , - * ? / L C #
     * 年(可选字段) empty, 1970-2099 , - * /
     * “*”——字符可以用于所有字段，在“分”字段中设为"*"表示"每一分钟"的含义。
     * “?”——字符可以用在“日”和“周几”字段.它用来指定'不明确的值'.这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。
     * “-”——字符被用来指定一个值的范围，比如在“小时”字段中设为"10-12"表示"10点到12点"。
     * “,”——字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday"。
     * “/”——字符用来指定一个值的的增加幅度.比如在“秒”字段中设置为"0/15"表示"第0, 15, 30,和45秒"。而"5/15"则表示"第5, 20, 35,和50".在'/'前加"*"字符相当于指定从0秒开始.每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说，其数值范围为0到 59，对于“小时”字段来说其为0到23,对于“日”字段来说为0到31,而对于“月”字段来说为1到12。
     * <p>
     * <p>
     * 例子：
     * <p>
     * 一些例子：
     * 0 0 10,14,16 * * ?      每天上午10点,下午2点和下午4点
     * 0 0,15,30,45 * 1-10 * ?     每月前10天每隔15分钟
     * 30 0 0 1 1 ? 2012     在2012年1月1日午夜过30秒时
     * 0 0 8-5 ? * MON-FRI    每个工作日的工作时间
     * "0 0 12 * * ?"每天中午十二点触发    （可能用的最多的格式）我的定时任务都是0 0 0 * * ？ 每天0点触发
     * <p>
     * "0 15 10 ? * *"每天早上10：15触发
     * "0 15 10 * * ?"每天早上10：15触发
     * "0 15 10 * * ? *"每天早上10：15触发
     * <p>
     * "0 15 10 * * ? 2005" 2005年的每天早上10：15触发
     * "0 * 14 * * ?"每天从下午2点开始到2点59分每分钟一次触发
     * "0 0/5 14 * * ?"每天从下午2点开始到2：55分结束每5分钟一次触发
     * "0 0/5 14,18 * * ?"每天的下午2点至2：55和6点至6点55分两个时间段内每5分钟一次触发
     * "0 0-5 14 * * ?"每天14:00至14:05每分钟一次触发
     * "0 10,44 14 ? 3 WED"三月的每周三的14：10和14：44触发
     * "0 15 10 ? * MON-FRI"每个周一、周二、周三、周四、周五的10：15触发
     * "0 15 10 15 * ?"每月15号的10：15触发
     * "0 15 10 L * ?"每月的最后一天的10：15触发
     * "0 15 10 ? * 6L"每月最后一个周五的10：15
     */
    //@Scheduled(initialDelay = 1000, fixedDelay = 1000 * 60 *60 * 12)
    @Scheduled(cron = "0 0 6 * * ?")//每天6点执行
    public void crawling() {
        logger.info("定时任务开启");
        Date createTime = DateUtil.date();
        String dateTimeStr = DateUtil.format(createTime, "yyyy-MM-dd");
        String html = RgsHttpUtils.getHtml("https://ncov.dxy.cn/ncovh5/view/pneumonia");
        Document document = Jsoup.parse(html);
        String text = document.select("script[id=getAreaStat]").toString();

        String pattern = "\\[(.*)\\]";
        Pattern reg = Pattern.compile(pattern);
        Matcher matcher = reg.matcher(text);
        String jsonStr = "";
        if (matcher.find()) {
            jsonStr = matcher.group(0);
        } else {
            System.out.println("NO MATCH");
        }
        List<CovidBO> provinceCovidList = JSONUtil.toList(jsonStr, CovidBO.class);
        List<CrawlingCovidDO> covidDOList = new ArrayList<>(1000);

        for (CovidBO province : provinceCovidList) {
            province.setCreateTime(createTime);
            province.setDateTimeStr(dateTimeStr);
            province.setCityType(2);
            List<CovidBO> cityList = JSONUtil.toList(province.getCities(), CovidBO.class);
            //处理省下面的城市
            for (CovidBO city : cityList) {
                city.setCreateTime(createTime);
                city.setDateTimeStr(dateTimeStr);
                city.setPid(province.getLocationId());
                city.setProvinceShortName(province.getProvinceShortName());
                city.setCityType(1);
                CrawlingCovidDO cityCovidDO = BeanUtil.copyProperties(city, CrawlingCovidDO.class);
                covidDOList.add(cityCovidDO);
            }
            //这个统计数据太大了，暂时取消
//            String statisticsDataUrl = province.getStatisticsData();
//            String statisticsData = RgsHttpUtils.getHtml(statisticsDataUrl);
//            JSONObject jsb = JSONUtil.parseObj(statisticsData);
//            JSONArray datas = JSONUtil.parseArray(jsb.getStr("data"));
//            province.setStatisticsData(datas.toString());
            province.setStatisticsData(null);
            province.setCities(null);
            CrawlingCovidDO provinceCovidDO = BeanUtil.copyProperties(province, CrawlingCovidDO.class);
            covidDOList.add(provinceCovidDO);
        }

        int i = crawlingCovidService.batchInsertCovidData(covidDOList);
        if (i > 0) {
            logger.info("数据保存成功");
        } else {
            logger.info("数据保存失败");
        }

    }


//    public static void main(String[] args) {
//
//
//        Date createTime = DateUtil.date();
//        String dateTimeStr = DateUtil.format(createTime, "yyyy-MM-dd");
//        String html = RgsHttpUtils.getHtml("https://ncov.dxy.cn/ncovh5/view/pneumonia");
//        //System.out.println("html:"+html);
//        Document document = Jsoup.parse(html);
//        String text = document.select("script[id=getAreaStat]").toString();
//        //System.out.println("text:"+text);
//
//        String pattern = "\\[(.*)\\]";
//        Pattern reg = Pattern.compile(pattern);
//        Matcher matcher = reg.matcher(text);
//        System.out.println("matcher:"+matcher);
//        String jsonStr = "";
//        if (matcher.find()) {
//            //这里就是原始json数据
//            jsonStr = matcher.group(0);
//            System.out.println("jsonStr:"+jsonStr);
//        } else {
//            System.out.println("NO MATCH");
//        }
////        List<CovidBO> provinceCovidList = JSONUtil.toList(jsonStr, CovidBO.class);
////        List<CrawlingCovidDO> covidDOList = new ArrayList<>(1000);
////
////        for (CovidBO province : provinceCovidList) {
////            province.setCreateTime(createTime);
////            province.setDateTimeStr(dateTimeStr);
////            province.setCityType(2);
////            List<CovidBO> cityList = JSONUtil.toList(province.getCities(), CovidBO.class);
////            //处理省下面的城市
////            for (CovidBO city : cityList) {
////                city.setCreateTime(createTime);
////                city.setDateTimeStr(dateTimeStr);
////                city.setPid(province.getLocationId());
////                city.setProvinceShortName(province.getProvinceShortName());
////                city.setCityType(1);
////                CrawlingCovidDO cityCovidDO = BeanUtil.copyProperties(city, CrawlingCovidDO.class);
////                covidDOList.add(cityCovidDO);
////            }
////            //这个统计数据太大了，暂时取消
//////            String statisticsDataUrl = province.getStatisticsData();
//////            String statisticsData = RgsHttpUtils.getHtml(statisticsDataUrl);
//////            JSONObject jsb = JSONUtil.parseObj(statisticsData);
//////            JSONArray datas = JSONUtil.parseArray(jsb.getStr("data"));
//////            province.setStatisticsData(datas.toString());
////            province.setStatisticsData(null);
////            province.setCities(null);
////            CrawlingCovidDO provinceCovidDO = BeanUtil.copyProperties(province, CrawlingCovidDO.class);
////            covidDOList.add(provinceCovidDO);
////        }
//
//    }


//    public static void main(String[] args) {
//
//
//        Date createTime = DateUtil.date();
//        String dateTimeStr = DateUtil.format(createTime, "yyyy-MM-dd");
//        String html = RgsHttpUtils.getHtml("https://www.114yygh.com/");
//        //System.out.println("html:"+html);
//        Document document = Jsoup.parse(html);
//        System.out.println(document);
//        //String text = document.select("script[id=getAreaStat]").toString();
//        //System.out.println("text:"+text);
////
////        String pattern = "\\[(.*)\\]";
////        Pattern reg = Pattern.compile(pattern);
////        Matcher matcher = reg.matcher(text);
////        System.out.println("matcher:"+matcher);
////        String jsonStr = "";
////        if (matcher.find()) {
////            //这里就是原始json数据
////            jsonStr = matcher.group(0);
////            System.out.println("jsonStr:"+jsonStr);
////        } else {
////            System.out.println("NO MATCH");
////        }
////        List<CovidBO> provinceCovidList = JSONUtil.toList(jsonStr, CovidBO.class);
////        List<CrawlingCovidDO> covidDOList = new ArrayList<>(1000);
////
////        for (CovidBO province : provinceCovidList) {
////            province.setCreateTime(createTime);
////            province.setDateTimeStr(dateTimeStr);
////            province.setCityType(2);
////            List<CovidBO> cityList = JSONUtil.toList(province.getCities(), CovidBO.class);
////            //处理省下面的城市
////            for (CovidBO city : cityList) {
////                city.setCreateTime(createTime);
////                city.setDateTimeStr(dateTimeStr);
////                city.setPid(province.getLocationId());
////                city.setProvinceShortName(province.getProvinceShortName());
////                city.setCityType(1);
////                CrawlingCovidDO cityCovidDO = BeanUtil.copyProperties(city, CrawlingCovidDO.class);
////                covidDOList.add(cityCovidDO);
////            }
////            //这个统计数据太大了，暂时取消
//////            String statisticsDataUrl = province.getStatisticsData();
//////            String statisticsData = RgsHttpUtils.getHtml(statisticsDataUrl);
//////            JSONObject jsb = JSONUtil.parseObj(statisticsData);
//////            JSONArray datas = JSONUtil.parseArray(jsb.getStr("data"));
//////            province.setStatisticsData(datas.toString());
////            province.setStatisticsData(null);
////            province.setCities(null);
////            CrawlingCovidDO provinceCovidDO = BeanUtil.copyProperties(province, CrawlingCovidDO.class);
////            covidDOList.add(provinceCovidDO);
////        }
//
//    }


}
